package salesforce;

//LC 116 重新排列句子中的单词

import java.util.Arrays;
import java.util.Comparator;
import java.util.TreeMap;

/**
 * 解法1：直接用Arrays.sort按长度排序 Arrays.sort(s, (a,b) ->  a.length() - b.length());
 * 因为Java默认使用merge sort在排序条件相等的情况下保持原来顺序
 *
 * 解法2：用一个TreeMap，key是单词长度，value是一个所有这个长度的单词拼成的string
 * 因为treemap有序，所以直接遍历keyset就是有序的 for(int k : map.keySet())
 *
 * 注意大小写转换，先整句转成小写再split， 最后再把第一个字母转大写
 */
public class ArrangeWords {
    public String arrangeWords(String text) {
        String[] s = text.toLowerCase().split(" ");
        Arrays.sort(s, Comparator.comparingInt(String::length));
        s[0] = s[0].substring(0, 1).toUpperCase() + s[0].substring(1);
        return String.join(" ", s);
    }

    public String arrangeWords2(String text) {
        TreeMap<Integer, StringBuilder> map=new TreeMap<>();
        String[] strs=text.split(" ");
        for(int i=0;i<strs.length;i++) {
            StringBuilder tmp=map.getOrDefault(strs[i].length(), new StringBuilder());
            tmp.append(strs[i]).append(" ");
            map.put(strs[i].length(), tmp);
        }
        StringBuilder sb=new StringBuilder();
        for(int k : map.keySet()) {
            StringBuilder tmp=map.get(k);
            if(tmp.charAt(0)<'a') tmp.setCharAt(0, (char)('a'+tmp.charAt(0)-'A'));
            sb.append(tmp);
        }
        if(sb.charAt(0)>'Z') sb.setCharAt(0, (char)('A'+sb.charAt(0)-'a'));
        return sb.deleteCharAt(sb.length()-1).toString();
    }

}
